package com.divemotor.ventarepuestosinternet.dao.impl;

import java.io.Serializable;
import java.util.Arrays;
import java.util.List;

import org.hibernate.Criteria;
import org.hibernate.FetchMode;
import org.hibernate.Query;
import org.hibernate.SessionFactory;
import org.hibernate.criterion.Order;
import org.hibernate.criterion.Projections;
import org.hibernate.criterion.Restrictions;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;

import com.divemotor.ventarepuestosinternet.beans.adapter.ImagenRepuestoAdapter;
import com.divemotor.ventarepuestosinternet.dao.ImagenRepuestoDAO;
import com.divemotor.ventarepuestosinternet.model.ImagenRepuesto;
import com.divemotor.ventarepuestosinternet.model.ImagenRepuestoNroSa;
import com.divemotor.ventarepuestosinternet.model.Repuesto;
import com.divemotor.ventarepuestosinternet.util.Constantes;

@SuppressWarnings("unchecked")
@Repository(value = "imagenRepuestoDAO")
public class ImagenRepuestoDAOImpl extends GenericoDAOImpl<ImagenRepuesto, Integer> implements ImagenRepuestoDAO, Serializable {

	private static final long serialVersionUID = -7050475953438424098L;
	
	@Autowired
	private SessionFactory sessionFactory;
	
	public ImagenRepuestoDAOImpl(){
		setClase(ImagenRepuesto.class);
	}

	@Override
	public List<ImagenRepuesto> listarImagenesRepuestosPorImagen(ImagenRepuesto imagenRepuesto) {
		Criteria criteria = sessionFactory.getCurrentSession().createCriteria(ImagenRepuesto.class);
		criteria.setFetchMode("imagen", FetchMode.JOIN);
		criteria.setFetchMode("repuesto", FetchMode.JOIN);
		criteria.add(Restrictions.eq("imagen", imagenRepuesto.getImagen()));
		criteria.add(Restrictions.not(Restrictions.eq("estado", Constantes.ESTADO_ELIMINADO)));
		criteria.addOrder(Order.asc("posicion"));
		return criteria.list();
	}

	public List<ImagenRepuestoAdapter> listarImagenesRepuestosActivosPorImagen(Integer idImagen, String chasis, String codGrupo) {
		Query q = sessionFactory.getCurrentSession().getNamedQuery("ImagenRepuesto.repuestoImagenRepuesto");
		q.setParameter("idImagen", idImagen);
		q.setParameter("indRepReemplazo", Constantes.INDICADOR_NEGATIVO);
		q.setParameter("chasis", chasis);
		q.setParameter("grupo", codGrupo);
		q.setParameterList("estado", Arrays.asList(Constantes.ESTADO_ACTIVO, Constantes.ESTADO_NO_APLICA));
		return q.list();
	}
	
	@Override
	public List<ImagenRepuesto> buscarPorNombreRepuesto(Repuesto repuesto) {
		String porc = Constantes.PORCENTAJE;
		
		Criteria criteria = sessionFactory.getCurrentSession().createCriteria(ImagenRepuesto.class, "imagenRepuesto")
				.createAlias("imagenRepuesto.repuesto", "repuesto")
				.createAlias("imagenRepuesto.imagen", "imagen")
				.add(Restrictions.not(Restrictions.eq("estado", Constantes.ESTADO_ELIMINADO)))
				.add(Restrictions.like("repuesto.nombre", porc + repuesto.getNombre() + porc).ignoreCase())
				.addOrder(Order.asc("repuesto.nombre"))
				.addOrder(Order.asc("imagen.idImagen"));
		return criteria.list();
	}

	@Override
	public List<ImagenRepuestoAdapter> buscarActivosPorNombreRepuesto(String descripcion, String chasis) {
		Query q = sessionFactory.getCurrentSession().getNamedQuery("ImagenRepuesto.listarPorDescripcion");
		q.setParameter("descripcion", Constantes.PORCENTAJE + descripcion + Constantes.PORCENTAJE);
		q.setParameter("estado", Constantes.ESTADO_ACTIVO);
		return q.list(); 
	}
	
	public boolean existeImagenRepuesto(ImagenRepuesto imagenRepuesto){
		Criteria criteria = sessionFactory.getCurrentSession().createCriteria(ImagenRepuesto.class, "imagenRepuesto");
		criteria.createAlias("imagenRepuesto.imagen", "imagen");
		criteria.createAlias("imagenRepuesto.repuesto", "repuesto");
		criteria.setProjection(Projections.count("idImagenRepuesto"));
		criteria.add(Restrictions.eq("imagen.idImagen", imagenRepuesto.getImagen().getIdImagen())).
				 add(Restrictions.eq("repuesto.idRepuesto", imagenRepuesto.getRepuesto().getIdRepuesto())).
				 add(Restrictions.eq("numSeqNum", imagenRepuesto.getNumSeqNum())).
				 add(Restrictions.ne("estado", Constantes.ESTADO_ELIMINADO));
		return ((Number)criteria.uniqueResult()).intValue() > 0;
	}
	
	public List<ImagenRepuestoAdapter> buscarPorNombreRepuesto(String descripcion, String chasis) {
		Query q = sessionFactory.getCurrentSession().getNamedQuery("ImagenRepuesto.buscarPorDescripcion");
		q.setParameter("descripcion", Constantes.PORCENTAJE + descripcion + Constantes.PORCENTAJE);
		q.setParameter("chasis", chasis);
		q.setParameter("estado", Constantes.ESTADO_ACTIVO);
		return q.list(); 
	}
	
	@Override
	public ImagenRepuesto obtenerImagenRepuesto(ImagenRepuesto imagenRepuesto) {
		Criteria criteria = sessionFactory.getCurrentSession().createCriteria(ImagenRepuesto.class);
		criteria.setFetchMode("imagen", FetchMode.JOIN);
		criteria.setFetchMode("repuesto", FetchMode.JOIN);
		criteria.add(Restrictions.eq("idImagenRepuesto", imagenRepuesto.getIdImagenRepuesto()));
		return (ImagenRepuesto) criteria.uniqueResult();
	}
	
	@Override
	public List<ImagenRepuestoNroSa> listarNumeroSaAdapter(ImagenRepuesto imagenRepuesto){
		Query q = sessionFactory.getCurrentSession().getNamedQuery("ImagenRepuestoNroSa.listarNumerosAdapter");
		q.setParameter("numIdImagenRepuesto", imagenRepuesto.getIdImagenRepuesto());
		return q.list();
	}
	
	@Override
	public void eliminarNumeroSa(ImagenRepuestoNroSa imgRptoNro){
		sessionFactory.getCurrentSession().delete(imgRptoNro);
	}

	@Override
	public void insertarNumero(ImagenRepuestoNroSa imagenRepuestoNroSa){
		sessionFactory.getCurrentSession().persist(imagenRepuestoNroSa);
	}
}
